{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from numpy import *\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def loadDataSet(fileName,delim='\\t'):\n",
    "    fr = open(fileName)\n",
    "    stringArr = [line.strip().split(delim) for line in fr.readlines()]\n",
    "    datArr = [list(map(float , line)) for line in stringArr]\n",
    "    return np.array(datArr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def pca(dataMat , topNfeat=99999):\n",
    "    meanVals = np.mean(dataMat,axis=0)\n",
    "    meanRemoved = dataMat - meanVals\n",
    "    covMat = np.cov(meanRemoved , rowvar=0)\n",
    "    eigVals , eigVects = np.linalg.eig(np.mat(covMat))\n",
    "    eigValInd = np.argsort(eigVals)\n",
    "    eigValInd = eigValInd[:-(topNfeat+1):-1]\n",
    "    redEigVects = eigVects[:,eigValInd]\n",
    "    lowDDataMat = meanRemoved * redEigVects\n",
    "    reconMat = (lowDDataMat * redEigVects.T) + meanVals\n",
    "    return lowDDataMat,reconMat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "dataMat = loadDataSet('testSet.txt')\n",
    "lowDMat , reconMat = pca(dataMat , 1)\n",
    "lowDMat2 , reconMat2 = pca(dataMat , 2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((1000, 2), (1000, 1), (1000, 2))"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "shape(dataMat) , lowDMat.shape , reconMat.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2a3c6a3f518>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(111)\n",
    "ax.scatter(dataMat[:,0].flatten(),dataMat[:,1].flatten(),marker='^',s=90)\n",
    "ax.scatter(reconMat[:,0].A.flatten(),reconMat[:,1].A.flatten(),marker='o',c='red')\n",
    "ax.scatter(reconMat2[:,0].A.flatten(),reconMat2[:,1].A.flatten(),marker='o',c='y')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644,\n",
       "       9.06393644, 9.06393644, 9.06393644, 9.06393644, 9.06393644])"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reconMat[:,0].A.flatten()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def replaceNanWithMean():\n",
    "    dataMat = np.mat(loadDataSet('secom.data',' '))\n",
    "    numFeat = shape(dataMat)[1]\n",
    "    for i in range(numFeat):\n",
    "        meanVal = np.mean(dataMat[np.nonzero(~isnan(dataMat[:,i].A))[0],i])\n",
    "        dataMat[np.nonzero(isnan(dataMat[:,i].A))[0],i] = meanVal\n",
    "    return dataMat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "dataMat = replaceNanWithMean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "meanVals = np.mean(dataMat,axis=0)\n",
    "meanRemoved = dataMat - meanVals\n",
    "covMat = np.cov(meanRemoved,rowvar=0)\n",
    "eigVals , eigVects = np.linalg.eig(covMat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(590, 590)"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "covMat.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [default]",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
